LIST(
    APPEND
        exec_PROGRAMS
        class_intrusive.cpp
        class_intrusive_map.cpp
        class_non_intrusive.cpp
        custom.cpp
        enum.cpp
        map_based_versionup.cpp
        protocol.cpp
        protocol_new.cpp
        reuse_zone.cpp
        simple.cpp
)

IF(NOT MSVC)
    LIST(APPEND with_pthread_PROGRAMS stream.cpp)
ENDIF()

IF(MSGPACK_BOOST)
    IF(NOT MSVC)
        LIST(APPEND with_boost_lib_PROGRAMS speed_test.cpp speed_test_nested_array.cpp)
    ENDIF()
ENDIF()

FOREACH(source_file ${exec_PROGRAMS})
    GET_FILENAME_COMPONENT(source_file_we ${source_file} NAME_WE)
    ADD_EXECUTABLE(${source_file_we} ${source_file})
    IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
        SET_PROPERTY(
            TARGET ${source_file_we}
            APPEND_STRING
            PROPERTY COMPILE_FLAGS "-Wall -Wextra -Werror -g -O3"
        )
    ENDIF()
    IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
        IF(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
            STRING(
                REGEX
                REPLACE
                    "/W[0-4]"
                    "/W3 /WX"
                    CMAKE_CXX_FLAGS
                    "${CMAKE_CXX_FLAGS}"
            )
        ELSE()
            SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /WX")
        ENDIF()
    ENDIF()
ENDFOREACH()

FOREACH(source_file ${with_pthread_PROGRAMS})
    GET_FILENAME_COMPONENT(source_file_we ${source_file} NAME_WE)
    ADD_EXECUTABLE(${source_file_we} ${source_file})
    TARGET_LINK_LIBRARIES(${source_file_we} pthread)
    IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
        SET_PROPERTY(
            TARGET ${source_file_we}
            APPEND_STRING
            PROPERTY COMPILE_FLAGS "-Wall -Wextra -Werror -g -O3 -pthread"
        )
    ENDIF()
    IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
        IF(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
            STRING(
                REGEX
                REPLACE
                    "/W[0-4]"
                    "/W3 /WX"
                    CMAKE_CXX_FLAGS
                    "${CMAKE_CXX_FLAGS}"
            )
        ELSE()
            SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /WX")
        ENDIF()
    ENDIF()
ENDFOREACH()

FOREACH(source_file ${with_boost_lib_PROGRAMS})
    INCLUDE_DIRECTORIES(../include ${Boost_INCLUDE_DIRS})
    GET_FILENAME_COMPONENT(source_file_we ${source_file} NAME_WE)
    ADD_EXECUTABLE(${source_file_we} ${source_file})
    LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})
    TARGET_LINK_LIBRARIES(
        ${source_file_we}
        ${Boost_TIMER_LIBRARY}
        ${Boost_CHRONO_LIBRARY}
        ${Boost_SYSTEM_LIBRARY}
    )
    IF(NOT MSVC AND NOT APPLE)
        TARGET_LINK_LIBRARIES(${source_file_we} rt)
    ENDIF()

    IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
        SET_PROPERTY(
            TARGET ${source_file_we}
            APPEND_STRING
            PROPERTY COMPILE_FLAGS "-Wall -Wextra -Werror -O3"
        )
    ENDIF()

    IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
        SET_PROPERTY(
            TARGET ${source_file_we}
            APPEND_STRING
            PROPERTY COMPILE_FLAGS " -Wno-mismatched-tags"
        )
    ENDIF()

    IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
        IF(
            (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER ${GNUCXX_NO_MISMATCHED_TAGS_SUPPORT_VERSION}
             )
            OR
                (CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL
                 ${GNUCXX_NO_MISMATCHED_TAGS_SUPPORT_VERSION}
                 )
        )
            SET_PROPERTY(
                TARGET ${source_file_we}
                APPEND_STRING
                PROPERTY COMPILE_FLAGS " -Wno-mismatched-tags"
            )
        ENDIF()
    ENDIF()

    IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
        IF(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
            STRING(
                REGEX
                REPLACE
                    "/W[0-4]"
                    "/W3 /WX"
                    CMAKE_CXX_FLAGS
                    "${CMAKE_CXX_FLAGS}"
            )
        ELSE()
            SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /WX")
        ENDIF()
    ENDIF()
ENDFOREACH()
